﻿#define _CRT_SECURE_NO_WARNINGS 1


//矩阵转置
//#include<stdio.h>
//int main()
//{
//	int i, j;
//	scanf("%d %d", &i, &j);
//	int arr[10][10];
//	int a = 0;
//	int b = 0;
//	for (a = 0; a < i; a++)
//	{
//		for (b = 0; b < j; b++)
//		{
//			scanf("%d", &arr[a][b]);
//		}
//	}
//	for (a = 0; a < j; a++)
//	{
//		for (b = 0; b < i; b++)
//		{
//			printf("%d ", arr[b][a]);
//		}
//		printf("\n");
//	}
//	return 0;
//}



//有序序列合并
//#include<stdio.h>
//int main()
//{
//	int n, m;
//	int i = 0;
//	int j = 0;
//	int arr1[1000] = { 0 };
//	int arr2[1000] = { 0 };
//	int add[2000] = { 0 };
//	scanf("%d %d", &n, &m);
//	for (i = 0; i < n; i++)
//	{
//		scanf("%d", &arr1[i]);
//	}
//	for (i = 0; i < m; i++)
//	{
//		scanf("%d", &arr2[i]);
//	}
//
//	int t = 0;
//	for (i = 0; i < n + m; i++)
//	{
//		if (i < n)
//		{
//			add[i] = arr1[i];
//			t = 1 + i;
//		}
//		else
//		{
//			add[i] = arr2[i - t];
//		}
//	}
//	 
//	//冒泡排序
//	int temp = 0;
//	for (i = 0; i < n + m-1; i++)
//	{
//		for (j = 0; j < n + m - 1; j++)
//		{
//			if (add[j] > add[j + 1])
//			{
//				temp = add[j];
//				add[j] = add[j+1];
//				add[j+1] = temp;
//			}
//		}
//	}
//	for (i = 0; i < n + m; i++)
//	{
//		printf("%d ", add[i]);
//	}
//	return 0;
//}


//实现一个函数，打印乘法口诀表，口诀表的行数和列数自己指定 如：输入9，输出9 * 9口诀表，输出12，输出12 * 12的乘法口诀表。
//#include<stdio.h>
//int main()
//{
//	int i, j;
//	scanf("%d %d", &i, &j);
//	for (int ii = 1; ii <= i; ii++)
//	{
//		for (int jj = 1; jj <= ii; jj++)
//		{
//			printf("%d*%d=%-4d", jj, ii, ii * jj);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//创建一个整形数组，完成对数组的操作 实现函数init() 初始化数组为全0.
// 实现print()  打印数组的每个元素 实现reverse()  函数完成数组元素的逆置。 要求：自己设计以上函数的参数，返回值。
//#include<stdio.h>
//void init(int arr[5])
//{
//	for (int i = 0; i < 5; i++)
//	{
//		arr[i] = 0;
//	}
//}
//
//void print(int arr[5])
//{
//	printf("打印初始数组");
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//void reverse(int arr[5])
//{
//	printf("逆置");
//	for (int i = 4; i >= 0; i--)
//		printf("%d ", arr[i]);
//}
//int main()
//{
//	int arr[5] = { 12,9,21,14,99 };
//	init(arr);
//	print(arr);
//	reverse(arr);
//	return 0;
//}


//写一个二分查找函数
// //功能：在一个升序数组中查找指定的数值，找到了就返回下标，找不到就返回 - 1.
//int bin_search(int arr[], int left, int right, int key)
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
#include<stdio.h>
int bin_search(int arr[], int left, int right, int key)
{
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > key)
		{
			right=mid-1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int key = 9;

	int r = bin_search(arr,left,right,key);
	if (r == -1)
	{
		printf("找不到\n");
	}
	else
	{
		printf("找到了，下标是%d\n", r);
	}
	return 0;
}